package com.zyj.eps.util;
import java.util.Date;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
 * @author super
 * @date 2022/3/25 21:27
 */
public class JwtHelper {
    /**
     * 生成token
     */
    public static String createToken(String userId) {
        /*
         * header 头部分已经被JJwt封装 非必要无需处理
         */
        /*
         * 准备 签名算法 + 签名密匙
         * 		signatureAlgorithm指定了签名算法
         * 		secretKey指定了签名密匙 密匙可以是多种数据类型
         */
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        String secretKey  = "i_am_the_SecretKey";

        /*
         * 准备 签发时间+过期时间
         *	 	Date nowTime 是签发时间
         * 		Date expTime  是过期时间
         */
        long MillisOfTimeNow = System.currentTimeMillis();//获取此刻时间（毫秒）
        Date nowTime = new Date(MillisOfTimeNow);
        long MillisOfTimeEffective = 1000*60;// 有效时长（毫秒）： 1min
        Date expTime=new Date(MillisOfTimeNow+MillisOfTimeEffective);


        /*
         * 设置注入生成token的信息
         */
        JwtBuilder builder=
                Jwts.builder()
                        .setId(userId)//是JWT的唯一标识，根据业务需要，这个可以设置为一个不重复的值，主要用来作为一次性token,从而回避重放攻击。
                        .setSubject("主体")
                        .setIssuedAt(nowTime) //设置签发时间
                        .signWith(signatureAlgorithm,secretKey);//Signature 签名：算法+密匙
//				.setExpiration(expTime);//签发后设置过期时间

        /*
         * 	压缩生成Token
         */
        String Token = builder.compact();

        return Token;

    }

    /**
     * 解析并验证Token方法函数
     * @param token
     */
    public static void parseToken(String token) {

        System.out.println("Begin***************验证token****************");

        Jws<Claims> JwtParseClaims=Jwts.parser()
                .setSigningKey("i_am_the_SecretKey")
                .parseClaimsJws(token);

        System.out.println(JwtParseClaims);
        System.out.println(JwtParseClaims.getBody());
        System.out.println(JwtParseClaims.getBody().getExpiration());

        System.out.println("End***************验证token****************");
    }
    /**
     * 解析并获取Id
     * @param token
     * @return
     */
    public static String parseAndget(String token) {
        Jws<Claims> JwtParseClaims=Jwts.parser()
                .setSigningKey("i_am_the_SecretKey")
                .parseClaimsJws(token);

        return JwtParseClaims.getBody().getId();

    }

}
